package jee.boot.module.iexp.service;

import jee.boot.common.basic.BaseConfig;
import jee.boot.common.basic.CrudService;
import jee.boot.common.basic.ServiceException;
import jee.boot.common.basic.result.MapData;
import jee.boot.entity.system.Filter;
import jee.boot.common.utils.HttpServletHolder;
import jee.boot.common.utils.JsonMapper;
import jee.boot.common.utils.StringUtils;
import jee.boot.entity.task.IexpTask;
import jee.boot.entity.task.IexpTaskItem;
import jee.boot.module.iexp.dao.IexpTaskDao;
import jee.boot.module.iexp.dao.IexpTaskItemDao;
import jee.boot.module.iexp.task.TaskListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * 导入导出任务服务
 */
@Service

public class IexpTaskService extends CrudService<IexpTaskDao, IexpTask> {
    @Autowired
    private TaskListener taskListener;
    @Autowired
    private IexpTaskItemDao iexpTaskItemDao;
    @Autowired
    private BaseConfig baseConfig;


    public IexpTask get(IexpTask entity) {
        IexpTask iexpTask = super.get(entity);
        IexpTaskItem query = new IexpTaskItem();
        query.addFilter(new Filter("head.id", "=", iexpTask.getId()));
        iexpTask.setItemList(iexpTaskItemDao.findList(query));
        return iexpTask;
    }


    public void save(IexpTask entity) {
        // 在task的json参数中去取 对线程池的选择和优先级
        if (entity.getJsonParam() != null) {
            Map map = JsonMapper.fromJsonString(entity.getJsonParam(), Map.class);
            if (map != null) {
                if (map.get("bigOrNormal") != null) {
                    entity.setBigOrNormal(StringUtils.equalsIgnoreCase(map.get("bigOrNormal").toString(), "big") ? "big" : "normal");
                }
                if (map.get("priority") != null) {
                    entity.setPriority(Integer.valueOf(map.get("priority").toString()));
                }
            }
        }
        // 设置任务的引用uri
        entity.setRefererUri(HttpServletHolder.getUri());
        // 设置语言
        entity.setLanguage(HttpServletHolder.getLanguage());
        super.save(entity);
        if (entity.getItemList() != null && !entity.getItemList().isEmpty()) {
            for (IexpTaskItem iexpTaskItem : entity.getItemList()) {
                iexpTaskItem.setHead(new IexpTask(entity.getId()));
                iexpTaskItem.preInsert();
                iexpTaskItemDao.insert(iexpTaskItem);
            }
        }
        // 中断等待间隔,启动任务查询
        interrupt();
    }

    public void update(IexpTask entity) {
        super.update(entity);
        String updateFlag = String.valueOf(System.currentTimeMillis());
        if (entity.getItemList() != null && !entity.getItemList().isEmpty()) {
            for (IexpTaskItem iexpTaskItem : entity.getItemList()) {
                iexpTaskItem.setHead(new IexpTask(entity.getId()));
                iexpTaskItem.setUpdateFlag(updateFlag);
                if (StringUtils.isBlank(iexpTaskItem.getId())) {
                    iexpTaskItem.preInsert();
                    iexpTaskItemDao.insert(iexpTaskItem);
                } else {
                    iexpTaskItem.preUpdate();
                    iexpTaskItemDao.update(iexpTaskItem);
                }
            }
        }
        IexpTaskItem iexpTaskItem = new IexpTaskItem(entity);
        iexpTaskItem.setUpdateFlag(updateFlag);
        iexpTaskItemDao.deleteByUpdateFlag(iexpTaskItem);
    }

    public void delete(IexpTask entity) {
        IexpTask iexpTask = get(entity);
        if (iexpTask != null) {
            if (!StringUtils.equals("iexp_status_new", iexpTask.getIexpStatus())) {
                throw new ServiceException(1401);
            }
            super.delete(entity);
            iexpTaskItemDao.delete(new IexpTaskItem(entity));
        }

    }

    /**
     * 检查并更新乐观锁,保证当前任务的独占性
     *
     * @param task 任务
     * @return
     */
    public boolean checkAndUpdateVersionAndStatus(IexpTask task) {
        return dao.checkAndUpdateVersionAndStatus(task);
    }
//
//    /**
//     * 下载文件
//     *
//     * @param entity
//     * @param response
//     */
//    public void download(IexpTask entity, HttpServletRequest request, HttpServletResponse response) {
//        try {
//            IexpTask task = get(entity);
//            if (task != null) {
//                attachmentService.download(request, response, task.getAttachment());
//            } else {
//                throw new ServiceException(1405, MapData.instance().put("task", task.getId()).data());
//            }
//        } catch (Exception e) {
//            logger.error("下载文件失败", e);
//            throw new ServiceException(1402);
//        }
//    }

    /**
     * 重新执行
     *
     * @param entity
     */
    public void reExecute(IexpTask entity) {
        IexpTask task = get(entity);
        if (task != null) {
            dao.reExecute(task);
            // 中断等待间隔,启动任务查询
            interrupt();
        } else {
            throw new ServiceException(1405, MapData.instance().put("task", task.getId()).data());
        }

    }

    /**
     * 中断等待间隔,启动任务查询
     */
    public void interrupt() {
        // 中断等待间隔,启动任务查询
        taskListener.interrupt();
    }

//    public List<IexpTask> jobTaskFindList(IexpTask entity) {
//        return this.dao.jobTaskFindList(entity);
//    }
}
